package com.cyber.plus.model.entity;

import com.cyber.plus.registry.ModItems;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.TntEntity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.mob.EndermiteEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.projectile.thrown.ThrownItemEntity;
import net.minecraft.item.Item;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.world.GameRules;
import net.minecraft.world.World;

/**
 * 自定义实体 触碰并且爆炸
 *
 * @version 1.0
 * @author: 贺坤
 * @createTime: 2023年07月10日 21:21
 */
public class CustomTntItemEntity extends ThrownItemEntity {


	public CustomTntItemEntity(World world, LivingEntity playerEntity) {
		super((EntityType<? extends ThrownItemEntity>) EntityType.ENDER_PEARL, playerEntity, world);
		setVelocity(playerEntity, playerEntity.getPitch(), playerEntity.getYaw(), 0.0f, 1.5f, 1.0f);
//		setItem(ModItems.CUSTOM_ITEM.getDefaultStack());
	}

	/**
	 * 获取默认项目
	 *
	 * @return
	 */
	@Override
	protected Item getDefaultItem() {
		return ModItems.CUSTOM_ITEM;
	}

	/**
	 * 命中实体的时候
	 * 对此实体应用损坏。子类之间的具体实现不同。
	 * LivingEntity有生命值，破坏实体会降低生命值。它还可以处理盾牌、掉落方块对头盔的额外伤害、设置攻击者、播放伤害声音等。
	 * 某些实体（如ItemEntity）也具有运行状况值，重写的方法会递减该值。还有几个实体，比如net.minecraft.entity.decoration.EndCrystalEntity，任何损坏都会丢弃实体（可能是爆炸）。
	 * 如果这被重写，它必须检查isInvulnerableTo的结果并提前返回。
	 * 返回值:
	 * 实体是否实际受损
	 * 请参阅:
	 * 对不可修复，LivingEntity.modifyAppliedDamage
	 * @param entityHitResult 命中结果
	 */
	@Override
	protected void onEntityHit(EntityHitResult entityHitResult) {
		super.onEntityHit(entityHitResult);
		System.out.println("************* 命中实体的时候");
//		命中结果
		entityHitResult
				// 获取实体
				.getEntity()
				// 破坏 疑似相当于 损坏当前道具
				.damage(DamageSource.thrownProjectile(this, this.getOwner()), 0.0f);

		blast();
	}

	/**
	 * 碰撞的时候
	 * @param hitResult
	 */
	@Override
	protected void onCollision(HitResult hitResult) {
		System.out.println("************* 碰撞的时候");
		super.onCollision(hitResult);

		// 当是在服务器执行 并且没有被删除的时候
		if (!this.world.isClient && !this.isRemoved()) {
			for (int i = 0; i < 32; ++i) {
				// 添加粒子效果
				this.world.addParticle(ParticleTypes.PORTAL,
				                       this.getX(),
				                       this.getY() + this.random.nextDouble() * 2.0,
				                       this.getZ(),
				                       this.random.nextGaussian(),
				                       0.0,
				                       this.random.nextGaussian());
			}

			blast();
			// 删除当前道具
			this.discard();
		}
	}

	/**
	 * 爆炸
	 */
	private void blast(	){
		/**
		 * 创建TNT
		 */
//	TntEntity tntEntity = new TntEntity(world, (double)getX() + 0.5, getY(), (double)getZ() + 0.5, null);
//	int i = tntEntity.getFuse();
//        tntEntity.setFuse((short)(world.random.nextInt(i / 4) + i / 8));
//        world.spawnEntity(tntEntity);
//
		/**
		 * 直接控制 地图爆炸
		 */
		this.world.createExplosion(this, this.getX(), this.getBodyY(0.0625), this.getZ(), 4.0f, World.ExplosionSourceType.MOB);
	}


	/**
	 * 时刻
	 * API说明:
	 * 这可以被覆盖以添加额外的逻辑。super.tick（）；在这种情况下应该调用。
	 * 实现 说明:
	 * 默认情况下，这会将所有逻辑委托给baseTick。
	 * 请参阅:
	 * LivingEntity.tickMovement，net.minecraft.entity.mob.MobEntity.mobTick
	 */
	@Override
	public void tick() {
		System.out.println("************* tick");
		Entity entity = this.getOwner();
		if (entity instanceof PlayerEntity && !entity.isAlive()) {
			this.discard();
		} else {
			super.tick();
		}
	}

	/**
	 * 移动到世界
	 * @param destination
	 * @return
	@Override
	@Nullable
	public Entity moveToWorld(ServerWorld destination) {
		// 获取使用人
		Entity entity = this.getOwner();
		if (entity != null && entity.world.getRegistryKey() != destination.getRegistryKey()) {
			this.setOwner(null);
		}
		return super.moveToWorld(destination);
	}*/
}
